home *** CD-ROM | disk | FTP | other *** search
/ CD ROM Paradise Collection 4 / CD ROM Paradise Collection 4 1995 Nov.iso / system / taskview.zip / task.c < prev    next >
C/C++ Source or Header  |  1995-02-06  |  8KB  |  255 lines

  1.  
  2. /*--------------------------------------------
  3.     TASK.C -- Displays task list
  4.  ----------------------------------------------*/
  5.  
  6. #pragma warning( disable : 4100 )
  7.  
  8. #include <windows.h>
  9. #include <toolhelp.h>
  10. #include <stdio.h>
  11. #include <stdlib.h>
  12. #include <string.h>
  13. #include <direct.h>
  14. #include <process.h>
  15.  
  16. #include "resource.h"
  17. #include "ctl3d.h"
  18. int PASCAL FAR SwitchToThisWindow (HWND);
  19.  
  20.  
  21. #define  MAXREAD        2048
  22. #define  MAXPATH        256
  23. #define  MAX_TASK       256
  24. #define  INVALID_TASK   NULL
  25.  
  26. HINSTANCE hInst;
  27. HWND      hMainWnd;
  28. HTASK     hThisTask;
  29.  
  30. long FAR PASCAL WndProc (HWND, WORD, WORD, LONG);
  31. long FAR PASCAL ListProc (HWND, WORD, WORD, LONG);
  32. int  TaskList (void);
  33.  
  34.  
  35. /*--------------------------------------------
  36.    NotifyRegisterCallBack : Send a Redraw to the window
  37.  ----------------------------------------------*/
  38. BOOL CALLBACK _loadds NotifyRegisterCallBack (WORD wID, DWORD d)
  39. {
  40.   if (    GetCurrentTask() != hThisTask
  41.       &&  (wID==NFY_EXITTASK  || wID==NFY_STARTTASK) )
  42.         PostMessage (hMainWnd, WM_PAINT, 0, 0l);
  43. return 0;
  44. } /* NotifyRegisterCallBack */
  45.  
  46.  
  47. /*--------------------------------------------
  48.    Displays opened windows for a given task
  49.  ----------------------------------------------*/
  50.  
  51. BOOL CALLBACK _export EnumProcFunction (HWND hTaskWnd, LPARAM Ark)
  52. {
  53. char   Line [64], szTitle[50];
  54.  
  55.    if (hTaskWnd==NULL)  return FALSE;
  56.    szTitle[0]=0;
  57.    GetWindowText (hTaskWnd, szTitle, sizeof szTitle);
  58.    wsprintf (Line, "%5d  %s %s", 
  59.              hTaskWnd, 
  60.              GetWindowWord (hTaskWnd, GWW_HWNDPARENT)==NULL ? (LPSTR) ">>" : (LPSTR) "->",
  61.              (LPSTR) szTitle);
  62.    SendDlgItemMessage (hMainWnd, IDC_LISTWINDOWS, LB_ADDSTRING, 0, (LPARAM)(LPSTR) Line);
  63.    if (szTitle[0]!=0)   SetDlgItemText (hMainWnd, IDC_MAINWND, (LPSTR) szTitle);
  64. return TRUE;
  65. } /* EnumProcWindow */
  66.  
  67.  
  68.  
  69. /*--------------------------------------------
  70.    WindowList : Initiate list of all windows
  71.  ----------------------------------------------*/
  72. int WindowList (HTASK hTask)
  73. {
  74. WNDENUMPROC  EnumProcInstance;
  75.  
  76.    SendDlgItemMessage (hMainWnd, IDC_LISTWINDOWS, LB_RESETCONTENT, 0, 0l);
  77.    SetDlgItemText (hMainWnd, IDC_MAINWND, (LPSTR) "");
  78.    EnumProcInstance = MakeProcInstance ( (FARPROC) EnumProcFunction, hInst);
  79.    if (EnumProcInstance==NULL)  return -1;
  80.    EnumTaskWindows (hTask, EnumProcInstance, 0l);
  81.    FreeProcInstance (EnumProcInstance);
  82. return 0;
  83. } /* WindowList */
  84.  
  85.  
  86. /*--------------------------------------------
  87.    Lists all tasks
  88.  ----------------------------------------------*/
  89. int  TaskList (void)
  90. {
  91. static int             Cur;
  92. static char            Line [80];
  93. static TASKENTRY       TaskEntry;
  94. static BOOL            New ;
  95. static HTASK    AllTask [MAX_TASK];
  96. static unsigned NbTask;
  97. static BOOL     Switch;
  98.  
  99.    if (NbTask == GetNumTasks ())  /* Le nombre de taches n'a pas change */
  100.      {
  101.        TaskEntry.dwSize = sizeof TaskEntry;
  102.        for ( TaskFirst (& TaskEntry ), New=FALSE, Cur=0 ;
  103.          ! New   &&  TaskEntry.hTask!=AllTask[Cur++]  && TaskNext (& TaskEntry) ;
  104.          New = TaskEntry.hTask!=AllTask[Cur++] )  ;
  105.        if (! New)  return 0;
  106.      } /* nombre de taches identique */
  107.  
  108.    NbTask = GetNumTasks ();
  109.    SendDlgItemMessage (hMainWnd, IDC_LISTTASK, LB_RESETCONTENT, 0, 0);
  110.    wsprintf (Line, "%d tΓches actives %s", NbTask, Switch ?  (LPSTR) "..." : (LPSTR) "---");
  111.    Switch = ! Switch;
  112.    SetDlgItemText (hMainWnd, IDC_SUMWND, Line);
  113.    TaskEntry.dwSize = sizeof TaskEntry;
  114.    TaskFirst (& TaskEntry );
  115.    Cur=0;
  116.    do
  117.      { 
  118.          wsprintf (Line, "%5d -> hInst %5d Module %9.9s",
  119.                 TaskEntry.hTask, TaskEntry.hInst, (LPSTR) TaskEntry.szModule);
  120.          SendDlgItemMessage (hMainWnd, IDC_LISTTASK, LB_ADDSTRING, 0, (LPARAM) (LPSTR) Line);
  121.          AllTask [Cur++] = TaskEntry.hTask;
  122.      }
  123.    while (TaskNext (& TaskEntry) );
  124. return Cur;
  125. } /* TaskList */
  126.  
  127.  
  128.  
  129. int ChangeStatus (HTASK hTask, UINT wMsg)
  130. {
  131. char Line [50];
  132.   wsprintf (Line, "%s Task %d ?", wMsg==WM_QUIT ? (LPSTR) "Kill" : (LPSTR) "End", hTask);
  133.   if (MessageBox (hMainWnd, Line, "Task Viewer", MB_YESNO)==IDYES)
  134.          PostAppMessage (hTask, wMsg, 0, 0);
  135.   hTask = INVALID_TASK;
  136. return 0;
  137. } /* ChangeStatus */
  138.  
  139.  
  140. HTASK ReadSelectedTask (void)
  141. {
  142. int i;
  143. char   szBuffer [MAXPATH + 1];
  144.     i = (WORD) SendDlgItemMessage (hMainWnd, IDC_LISTTASK, LB_GETCURSEL, 0, 0L);
  145.     if (i==LB_ERR)    return NULL;
  146.     SendDlgItemMessage (hMainWnd, IDC_LISTTASK, LB_GETTEXT, i, (LONG) (LPSTR) szBuffer);
  147. return (HTASK) atoi (szBuffer);
  148. }
  149.  
  150. HWND ReadSelectedWnd (void)
  151. {
  152. int i;
  153. char   szBuffer [MAXPATH + 1];
  154.   i = (WORD) SendDlgItemMessage (hMainWnd, IDC_LISTWINDOWS, LB_GETCURSEL, 0, 0L);
  155.   if (i==LB_ERR)    return NULL;
  156.   SendDlgItemMessage (hMainWnd, IDC_LISTWINDOWS, LB_GETTEXT, i, (LONG) (LPSTR) szBuffer);
  157. return (HWND) atoi (szBuffer);
  158. }
  159.  
  160.  
  161. /* -------------------------------- */
  162. /* boucle de reception des messages */
  163. /* -------------------------------- */
  164. long FAR PASCAL WndProc (HWND hWnd, WORD message, WORD wParam, LONG lParam)
  165. {
  166. HTASK  hTask;
  167. HWND   hCurWnd;
  168.   switch (message)
  169.     {
  170.              
  171.        case WM_INITDIALOG :
  172.              hMainWnd = hWnd;
  173.             break;
  174.  
  175.        case WM_COMMAND :
  176.             hTask = ReadSelectedTask ();
  177.             switch (wParam)
  178.               {
  179.                  case IDC_LISTTASK :
  180.                     if (HIWORD(lParam) == LBN_SELCHANGE)  WindowList (hTask);
  181.                     if (HIWORD(lParam) == LBN_DBLCLK)  /* Double Click */
  182.                        ChangeStatus (hTask, WM_QUIT);
  183.                     break;
  184.  
  185.                  case IDOK :
  186.                     EndDialog (hWnd, 0);
  187.                     break;
  188.  
  189.                  case ID_SWITCHTO :
  190.                     hCurWnd = ReadSelectedWnd();
  191.                     PostMessage (hCurWnd, WM_ACTIVATE, WA_ACTIVE, 0l);
  192.                     if (IsIconic (hCurWnd)) 
  193.                        ShowWindow (hCurWnd, SW_RESTORE);
  194.                     break;
  195.                     
  196.                  case ID_KILL :
  197.                     ChangeStatus (hTask, WM_QUIT);
  198.                     break;
  199.  
  200.                  case ID_END : 
  201.                     hCurWnd = ReadSelectedWnd ();
  202.                     PostMessage (hCurWnd, WM_CLOSE, 0, 0l);
  203.                     break;                    
  204.                     
  205.                  
  206.                  case ID_ONTOP :
  207.                  case ID_NOTONTOP :
  208.                     SetWindowPos (hWnd, wParam==ID_ONTOP ? HWND_TOPMOST : HWND_NOTOPMOST,
  209.                                   0, 0, 0, 0, 
  210.                                   SWP_NOMOVE | SWP_NOREDRAW | SWP_NOSIZE );
  211.                     break;  
  212.               } /* switch WM_COMMAND */
  213.             break; 
  214.                
  215.        case WM_PAINT:
  216.             hTask = ReadSelectedTask ();
  217.             TaskList ();               
  218.             if (hTask!=INVALID_TASK)   WindowList (hTask);
  219.             break;
  220.  
  221.        case WM_CLOSE :
  222.        case WM_DESTROY :
  223.             EndDialog (hWnd, 0);
  224.             break;
  225.    }
  226. // return DefWindowProc(hWnd,message,wParam,lParam);
  227. return FALSE;
  228. } /* MAIN Callback */
  229.  
  230.  
  231.  
  232.  
  233. /* ----------------------------- */
  234. /* WinMain                       */
  235. /* ----------------------------- */
  236. int PASCAL WinMain (HANDLE hInstance, HANDLE hPrevInstance,
  237.                     LPSTR lpszCmdLine, int nCmdShow)
  238. {
  239. FARPROC lpfnNotifyProc;
  240.  
  241.      hInst = hInstance;
  242.      hThisTask=GetCurrentTask ();
  243.      Ctl3dRegister (hInstance);
  244.      Ctl3dAutoSubclass (hInstance);
  245.     
  246.      lpfnNotifyProc = MakeProcInstance (NotifyRegisterCallBack, hInstance);
  247.      NotifyRegister (0, (LPFNNOTIFYCALLBACK) lpfnNotifyProc, NF_NORMAL);
  248.      DialogBox (hInstance,(LPSTR) "TASKVIEWER", 0, (DLGPROC) WndProc);
  249.      NotifyUnRegister (0);
  250.      FreeProcInstance (lpfnNotifyProc);
  251.  
  252.      Ctl3dUnregister (hInstance);
  253. return 0;
  254. }
  255.